import axios from 'axios'; // 基于promise
import Router from '@/router/index'
import Vue from 'vue'
import { ACCESS_TOKEN, HAS_BANK, USER_NAME } from '@/store/mutation-types'
import {
  Toast
} from 'vant'
// axios可以配配置拦截器 我可以给实例增加多个拦截器
// axios 实例的唯一性 ，我可以给，每个请求 独立增加拦截器
// import store from '@/store';
// import * as types from '@/store/actions-type'

// 开发的时候 localhost  /xxx
class AjaxRequest {
  constructor() {
    // development production
    this.baseURL = process.env.NODE_ENV !== 'production' ? 'http://localhost:8088' :
      'https://baidu.com'; // 基础路径
    this.timeout = 100000; // 超时时间
    // message组件

    this.queue = {}
  }
  setInterceptor(instance, url) {
    instance.interceptors.request.use((config) => { // 请求拦截
      // 每次请求前 将token 放到请求中
      config.headers.Authorization = Vue.ls.get(ACCESS_TOKEN) || ""


      // 显示loading
      if (Object.keys(this.queue).length === 0) {
        this.toast = Toast.loading({
          mask:true,
          message: '正在加载', // 每次显示toast组件时 都叫 正在加载 否则别人把txt的值改了
          duration: 0
        });
        // this.toast.show(); // 如果没有请求过 显示loading
      }
      // 请求前 增加请求队列
      this.queue[url] = url; // 存入队列中
      return config;
    }, err => {
      return Promise.reject(err);
    });
    instance.interceptors.response.use((res) => { // 响应拦截
      // 关闭loading
      // 可以对返回的状态码做各种匹配
      delete this.queue[url]; //  请求完成后删除对应的url
      if (Object.keys(this.queue).length === 0) {
        this.toast.clear(); // 当队列被清空隐藏掉即可
      }
      if (res.status === 200) {
        if (res.data.code === 502) {
          Vue.ls.remove(ACCESS_TOKEN)
          Vue.ls.remove(HAS_BANK)
          Vue.ls.remove(USER_NAME)
          Toast.loading({
            message: '您暂未登录请登录',
            duration: 500,
            onClose: function () {
              Router.push({ path: '/login' })
            }
          })
          // 其他不是0的情况交给用户自己处理
          return Promise.reject()
        }
        return res.data
      }
      else {
        return Promise.reject(res.data)
      }
    }, err => {
      delete this.queue[url]; //  请求完成后删除对应的url
      if (Object.keys(this.queue).length === 0) {
        this.toast.clear(); // 当队列被清空隐藏掉即可
      }
      if (err.message.includes('timeout')) {   // 判断请求异常信息中是否含有超时timeout字符串
        Toast.fail({
          message: '网络请求超时,请检查网络是否正常',
          closeOnClickOverlay: true,
          duration: 1000
        })
        return Promise.reject(err);          // reject这个错误信息
      }
      Toast.fail({
        message: '服务器正忙,请稍后再试',
        closeOnClickOverlay: true,
        duration: 1000
      })
      return Promise.reject(err);
    })
  }
  request(options) {
    let instance = axios.create();
    let config = {
      ...options,
      baseURL: this.baseURL,
      timeout: this.timeout
    }
    this.setInterceptor(instance, options.url); // 给这个实例增加拦截功能
    return instance(config); // 返回的是一个promise
  }
}

export default new AjaxRequest
